Amazon EC2 Systems ManagerでMaintenance Windowsを試してみた
はじめに
こんにちは、城内です。
今回は、先のAWS re:Invent 2016で発表されたAmazon EC2 Systems Managerを使ってみたいと思います。
いままでの紹介記事は以下になります。
すでに複数ある機能の大半は紹介されていますが、Maintenance Windowsを試した記事がなかったので使ってみました。
やってみた
では、早速やってみたいと思います。
今回の手順は以下になります。
- メンテナンスウィンドウを作成する
- 作成したメンテナンスウィンドウにターゲットを設定する
- 作成したメンテナンスウィンドウにSSMコマンドドキュメント(タスク)を設定する
実行するタスクはサーバの再起動にしたいと思います。
メンテナンスウィンドウを作成する
EC2のマネージメントコンソールの画面で、左メニューから「Maintenance Windows」を選択し、「Create a Maintenance Windows」ボタンをクリックします。
「Name」に任意の名前を入力し、スケジュールを指定します。 今回はSchedule builderでの指定だと思ったように動いてくれなかったため、Cron方式での指定にしています。「毎日16:05(JST)」に実行するように記述しています。 「Duration」にはウィンドウの時間を入力し、「Cutoff」にはウィンドウの終了時間から何時間前よりタスクの実行を抑止するかを入力します。2時間のウィンドウに対して、終了1時間前からタスクは実行しないように指定しています。
Cutoffは、メンテナンスウィンドウ内で複数のタスクを実行するケースで、タスクの実行時間が想定外に長くなってしまった場合に、後続タスクを実行せずに切り上げて終了させたい場合などに有効かと思います。
作成したメンテナンスウィンドウにターゲットを設定する
次に、ターゲットのインスタンスを設定します。
指定の方法は、タグを使って制御する方法と直接インスタンスを指定する方法があります。今回は管理下に1インスタンスしかいないので、直接インスタンスIDを指定しています。
作成したメンテナンスウィンドウにSSMコマンドドキュメントを設定する
最後に、タスクの設定をします。
今回は「AWS-RunShellScript」タスクを使用します。
「Priority」は、複数タスクを設定する場合の実行順序を制御するために使用します。今回は1タスクしか設定しないので、「1」にしておきます。 「Registered Targets」は、先で設定したターゲットに紐づくWindow Target IDを指定します。1つしかないので、そのまま設定します。
「Commands」には、ターゲットインスタンス上で実行するコマンドを指定します。今回はshutdown -r +1を設定しています。rebootやshutdown -r nowも試したのですが、実行はされるものの結果が失敗になってしまうため、試行錯誤した結果shutdown -r +1になりました。 「Service Role Arn」は、メンテナンスウィンドウを操作できる権限を持ったロールを指定します。今回は「AmazonSSMMaintenanceWindowRole」というロールを作成しています。 「Max Concurrency」は同時実行数を指定し、「Max Errors」は許容できる上限のエラー数を指定します。
なお、「Service Role Arn」に指定した「AmazonSSMMaintenanceWindowRole」ですが、以下のように作成しています。
「AmazonSSMMaintenanceWindowRole」ポリシーをアタッチしています。
信頼関係に「ssm.amazonaws.com」を追加しています。
実行結果
「History」タブに実行結果が表示されています。「View details」をクリックすると詳細を確認できます。
タスクの詳細が表示されます。
コマンドの「View details」をクリックすると、「コマンド履歴」のページに遷移します。
コマンドの詳細が表示されます。
ということで、スケジューリングされた時刻にタスクが実行され、無事にサーバが再起動されました。
さいごに
メンテナンスウィンドウの機能的には、Cronやタスクスケジューラのようなもので、それがリモートで制御できると思えばいいような気がしました。 ただし、複数タスクを順序制御しながら実行できる点などは、メンテナンスウィンドウ特有の機能かと思います。
今回は複数タスクを連携させるような処理は試しませんでしたが、その辺りはうまく設計し有効に活用できればいいなと思いました。